<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>总结Vue数据监测</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!--
			Vue监视属性的原理：
				1.Vue会监视data中所有层次的数据。

				2.如何检测对象中的数据？
					通过setter实现监视，且要在new Vue时就传入要检测的数据。
						（1）对象中后追加的属性，Vue默认不做响应处理。
						（2）如需给后添加的属性做响应，使用如下API：
							Vue.set(target,propertyName/index,value); 或
							vm.$set(taget,propertyName/index,value);

				3.如何检测数组中的数据？
					通过包裹数组更新元素的方法实现，本质就是做了两件事：
						（1）调用原生对应的方法对数组进行更新操作；
						（2）重新解析模板进而更新界面。

				4.在Vue修改数组中某个元素一定要用如下方法：
					（1）使用这些API：push()、pop()、shift()、unshift()、splice()、sort()、reverse()
					（2）Vue.set() 或 vm.$set();
				
				特别注意：
					Vue.set() 和 vm.set() 不能给vm 或 vm的根数据对象 添加属性。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<button @click="student.age.rAge++">年龄+1岁</button> <br/>
			<button @click.once="addSex()">添加性别属性，默认值：男</button> <br/>
			<button @click="student.sex = '未知'">修改性别</button> <br/>
			<button @click.once="addfriendInFrist()">在列表首位添加一个朋友</button> <br/>
			<button @click="updateFristfriendName()">修改第一个朋友的名字为：张三，年龄为：18</button> <br/>
			<button @click.once="addHobby()">添加一个爱好</button> <br/>
			<button @click="updateFristHobby()">修改一个爱好为：健身</button> <br/>

			<h1>学生信息</h1>
			<h2>姓名：{{student.name}}</h2>
			<h2 v-show="student.sex">性别：{{student.sex}}</h2>
			<h2>年龄：{{student.age.rAge}}</h2>
			<h2>爱好：</h2>
			<ul>
				<li v-for="(h,index) in student.hobby" :key="index">
					{{h}}
				</li>
			</ul>
			<h2>朋友们</h2>
			<ul>
				<li v-for="(f,index) in student.friends" :key="index">
					{{f.name}}--{{f.age}}
				</li>
			</ul>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		const vm = new Vue({
			el:'#root',
			data:{
				student:{
					name:'覃小宝',
					age:{
						rAge:18,
					},
					hobby:['抽烟','喝酒','烫头'],
					friends:[
						{name:'jerry',age:35},
						{name:'tony',age:36}
					]
				}
			},
			methods: {
				addSex(){
					// Vue.set()方法：添加一个响应式属性，在应用中可写为this.$set(对象或数组,属性名或下标值,value)
					// Vue.set(this.student,'sex','男')
					//添加一个性别属性（并且它还是响应式的属性）
					this.$set(this.student,'sex','男');
				},
				addfriendInFrist(){
					this.student.friends.unshift({name:'durant',age:38});
				},
				updateFristfriendName(){
					this.student.friends[0].name = '张三';
					this.student.friends[0].age = 18;
				},
				addHobby(){
					this.student.hobby.push('学习');
				},
				updateFristHobby(){
					//第一种方法
					this.student.hobby.splice(0,1,'健身');
					//第二种方法
					// this.$set(this.student.hobby,0,'健身');
				}
			}
		})
	</script>
</html>